package entity;

import java.util.List;
import java.util.logging.Level;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 * Facade for entity FichaEndodontica.
 * 
 * @see entity.FichaEndodontica
 * @author MyEclipse Persistence Tools
 */
@Stateless
public class FichaEndodonticaFacade implements FichaEndodonticaFacadeLocal,
		FichaEndodonticaFacadeRemote {
	// property constants
	public static final String NOME_ALUNO = "nomeAluno";
	public static final String NOME_PACIENTE = "nomePaciente";
	public static final String DATA_DE_NASC = "dataDeNasc";
	public static final String PROFISSAO = "profissao";
	public static final String ESTADO_CIVIL = "estadoCivil";
	public static final String ENDERECO = "endereco";
	public static final String NUMERO = "numero";
	public static final String CIDADE = "cidade";
	public static final String BAIRRO = "bairro";
	public static final String TELEFONE = "telefone";
	public static final String ANO_ALUNO = "anoAluno";
	public static final String ENCAMINHAMENTO = "encaminhamento";
	public static final String RAZAO_CONSULTA = "razaoConsulta";
	public static final String OBSERVACOES = "observacoes";
	public static final String SEMIOLOGIA_SUBJETIVA = "semiologiaSubjetiva";
	public static final String TESTE_DE_VITALIDADE_PULPAR = "testeDeVitalidadePulpar";
	public static final String PERCUSSAO = "percussao";
	public static final String PALPACAO = "palpacao";
	public static final String RADIOGRAFICOS = "radiograficos";
	public static final String TESTE_CAVIDADE = "testeCavidade";
	public static final String TESTE_DE_ANESTESIA = "testeDeAnestesia";
	public static final String CANAIS_RADICULARES = "canaisRadiculares";
	public static final String RAIZES = "raizes";
	public static final String TECIDOS_PARA_ENDODONTICOS = "tecidosParaEndodonticos";
	public static final String DIAGNOSTICO = "diagnostico";
	public static final String TRATAMENTO_INDICADO = "tratamentoIndicado";

	@PersistenceContext
	private EntityManager entityManager;

	/**
	 * Perform an initial save of a previously unsaved FichaEndodontica entity.
	 * All subsequent persist actions of this entity should use the #update()
	 * method.
	 * 
	 * @param entity
	 *            FichaEndodontica entity to persist
	 * @throws RuntimeException
	 *             when the operation fails
	 */
	public void save(FichaEndodontica entity) {
		LogUtil.log("saving FichaEndodontica instance", Level.INFO, null);
		try {
			entityManager.persist(entity);
			LogUtil.log("save successful", Level.INFO, null);
		} catch (RuntimeException re) {
			LogUtil.log("save failed", Level.SEVERE, re);
			throw re;
		}
	}

	/**
	 * Delete a persistent FichaEndodontica entity.
	 * 
	 * @param entity
	 *            FichaEndodontica entity to delete
	 * @throws RuntimeException
	 *             when the operation fails
	 */
	public void delete(FichaEndodontica entity) {
		LogUtil.log("deleting FichaEndodontica instance", Level.INFO, null);
		try {
			entity = entityManager.getReference(FichaEndodontica.class, entity
					.getNumeroProntuario());
			entityManager.remove(entity);
			LogUtil.log("delete successful", Level.INFO, null);
		} catch (RuntimeException re) {
			LogUtil.log("delete failed", Level.SEVERE, re);
			throw re;
		}
	}

	/**
	 * Persist a previously saved FichaEndodontica entity and return it or a
	 * copy of it to the sender. A copy of the FichaEndodontica entity parameter
	 * is returned when the JPA persistence mechanism has not previously been
	 * tracking the updated entity.
	 * 
	 * @param entity
	 *            FichaEndodontica entity to update
	 * @return FichaEndodontica the persisted FichaEndodontica entity instance,
	 *         may not be the same
	 * @throws RuntimeException
	 *             if the operation fails
	 */
	public FichaEndodontica update(FichaEndodontica entity) {
		LogUtil.log("updating FichaEndodontica instance", Level.INFO, null);
		try {
			FichaEndodontica result = entityManager.merge(entity);
			LogUtil.log("update successful", Level.INFO, null);
			return result;
		} catch (RuntimeException re) {
			LogUtil.log("update failed", Level.SEVERE, re);
			throw re;
		}
	}

	public FichaEndodontica findById(Integer id) {
		LogUtil.log("finding FichaEndodontica instance with id: " + id,
				Level.INFO, null);
		try {
			FichaEndodontica instance = entityManager.find(
					FichaEndodontica.class, id);
			return instance;
		} catch (RuntimeException re) {
			LogUtil.log("find failed", Level.SEVERE, re);
			throw re;
		}
	}

	/**
	 * Find all FichaEndodontica entities with a specific property value.
	 * 
	 * @param propertyName
	 *            the name of the FichaEndodontica property to query
	 * @param value
	 *            the property value to match
	 * @param rowStartIdxAndCount
	 *            Optional int varargs. rowStartIdxAndCount[0] specifies the the
	 *            row index in the query result-set to begin collecting the
	 *            results. rowStartIdxAndCount[1] specifies the the maximum
	 *            number of results to return.
	 * @return List<FichaEndodontica> found by query
	 */
	@SuppressWarnings("unchecked")
	public List<FichaEndodontica> findByProperty(String propertyName,
			final Object value, final int... rowStartIdxAndCount) {
		LogUtil.log("finding FichaEndodontica instance with property: "
				+ propertyName + ", value: " + value, Level.INFO, null);
		try {
			final String queryString = "select model from FichaEndodontica model where model."
					+ propertyName + "= :propertyValue";
			Query query = entityManager.createQuery(queryString);
			query.setParameter("propertyValue", value);
			if (rowStartIdxAndCount != null && rowStartIdxAndCount.length > 0) {
				int rowStartIdx = Math.max(0, rowStartIdxAndCount[0]);
				if (rowStartIdx > 0) {
					query.setFirstResult(rowStartIdx);
				}

				if (rowStartIdxAndCount.length > 1) {
					int rowCount = Math.max(0, rowStartIdxAndCount[1]);
					if (rowCount > 0) {
						query.setMaxResults(rowCount);
					}
				}
			}
			return query.getResultList();
		} catch (RuntimeException re) {
			LogUtil.log("find by property name failed", Level.SEVERE, re);
			throw re;
		}
	}

	public List<FichaEndodontica> findByNomeAluno(Object nomeAluno,
			int... rowStartIdxAndCount) {
		return findByProperty(NOME_ALUNO, nomeAluno, rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByNomePaciente(Object nomePaciente,
			int... rowStartIdxAndCount) {
		return findByProperty(NOME_PACIENTE, nomePaciente, rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByDataDeNasc(Object dataDeNasc,
			int... rowStartIdxAndCount) {
		return findByProperty(DATA_DE_NASC, dataDeNasc, rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByProfissao(Object profissao,
			int... rowStartIdxAndCount) {
		return findByProperty(PROFISSAO, profissao, rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByEstadoCivil(Object estadoCivil,
			int... rowStartIdxAndCount) {
		return findByProperty(ESTADO_CIVIL, estadoCivil, rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByEndereco(Object endereco,
			int... rowStartIdxAndCount) {
		return findByProperty(ENDERECO, endereco, rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByNumero(Object numero,
			int... rowStartIdxAndCount) {
		return findByProperty(NUMERO, numero, rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByCidade(Object cidade,
			int... rowStartIdxAndCount) {
		return findByProperty(CIDADE, cidade, rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByBairro(Object bairro,
			int... rowStartIdxAndCount) {
		return findByProperty(BAIRRO, bairro, rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByTelefone(Object telefone,
			int... rowStartIdxAndCount) {
		return findByProperty(TELEFONE, telefone, rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByAnoAluno(Object anoAluno,
			int... rowStartIdxAndCount) {
		return findByProperty(ANO_ALUNO, anoAluno, rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByEncaminhamento(Object encaminhamento,
			int... rowStartIdxAndCount) {
		return findByProperty(ENCAMINHAMENTO, encaminhamento,
				rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByRazaoConsulta(Object razaoConsulta,
			int... rowStartIdxAndCount) {
		return findByProperty(RAZAO_CONSULTA, razaoConsulta,
				rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByObservacoes(Object observacoes,
			int... rowStartIdxAndCount) {
		return findByProperty(OBSERVACOES, observacoes, rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findBySemiologiaSubjetiva(
			Object semiologiaSubjetiva, int... rowStartIdxAndCount) {
		return findByProperty(SEMIOLOGIA_SUBJETIVA, semiologiaSubjetiva,
				rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByTesteDeVitalidadePulpar(
			Object testeDeVitalidadePulpar, int... rowStartIdxAndCount) {
		return findByProperty(TESTE_DE_VITALIDADE_PULPAR,
				testeDeVitalidadePulpar, rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByPercussao(Object percussao,
			int... rowStartIdxAndCount) {
		return findByProperty(PERCUSSAO, percussao, rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByPalpacao(Object palpacao,
			int... rowStartIdxAndCount) {
		return findByProperty(PALPACAO, palpacao, rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByRadiograficos(Object radiograficos,
			int... rowStartIdxAndCount) {
		return findByProperty(RADIOGRAFICOS, radiograficos, rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByTesteCavidade(Object testeCavidade,
			int... rowStartIdxAndCount) {
		return findByProperty(TESTE_CAVIDADE, testeCavidade,
				rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByTesteDeAnestesia(
			Object testeDeAnestesia, int... rowStartIdxAndCount) {
		return findByProperty(TESTE_DE_ANESTESIA, testeDeAnestesia,
				rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByCanaisRadiculares(
			Object canaisRadiculares, int... rowStartIdxAndCount) {
		return findByProperty(CANAIS_RADICULARES, canaisRadiculares,
				rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByRaizes(Object raizes,
			int... rowStartIdxAndCount) {
		return findByProperty(RAIZES, raizes, rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByTecidosParaEndodonticos(
			Object tecidosParaEndodonticos, int... rowStartIdxAndCount) {
		return findByProperty(TECIDOS_PARA_ENDODONTICOS,
				tecidosParaEndodonticos, rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByDiagnostico(Object diagnostico,
			int... rowStartIdxAndCount) {
		return findByProperty(DIAGNOSTICO, diagnostico, rowStartIdxAndCount);
	}

	public List<FichaEndodontica> findByTratamentoIndicado(
			Object tratamentoIndicado, int... rowStartIdxAndCount) {
		return findByProperty(TRATAMENTO_INDICADO, tratamentoIndicado,
				rowStartIdxAndCount);
	}

	/**
	 * Find all FichaEndodontica entities.
	 * 
	 * @param rowStartIdxAndCount
	 *            Optional int varargs. rowStartIdxAndCount[0] specifies the the
	 *            row index in the query result-set to begin collecting the
	 *            results. rowStartIdxAndCount[1] specifies the the maximum
	 *            count of results to return.
	 * @return List<FichaEndodontica> all FichaEndodontica entities
	 */
	@SuppressWarnings("unchecked")
	public List<FichaEndodontica> findAll(final int... rowStartIdxAndCount) {
		LogUtil.log("finding all FichaEndodontica instances", Level.INFO, null);
		try {
			final String queryString = "select model from FichaEndodontica model";
			Query query = entityManager.createQuery(queryString);
			if (rowStartIdxAndCount != null && rowStartIdxAndCount.length > 0) {
				int rowStartIdx = Math.max(0, rowStartIdxAndCount[0]);
				if (rowStartIdx > 0) {
					query.setFirstResult(rowStartIdx);
				}

				if (rowStartIdxAndCount.length > 1) {
					int rowCount = Math.max(0, rowStartIdxAndCount[1]);
					if (rowCount > 0) {
						query.setMaxResults(rowCount);
					}
				}
			}
			return query.getResultList();
		} catch (RuntimeException re) {
			LogUtil.log("find all failed", Level.SEVERE, re);
			throw re;
		}
	}

}